package org.android.brasil.projetos.oktoberfest2011.persistencia;

import java.util.ArrayList;
import java.util.List;

import org.android.brasil.projetos.oktoberfest2011.negocio.model.Apresentacao;
import org.android.brasil.projetos.oktoberfest2011.utils.Constantes;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;

public class ApresentacaoDAO extends BasicoDAO {

	public static final String COLUNA_ID_APRESENTACAO = "_id";
	public static final String COLUNA_DIA = "dia";
	public static final String COLUNA_HORA_INICIO = "hora";
	public static final String COLUNA_HORA_FIM = "hora_fim";
	public static final String COLUNA_FAVORITO = "favorito";
	public static final String COLUNA_NOME = "nome";
	public static final String COLUNA_CATEGORIA = "categoria";
	public static final String COLUNA_SETOR = "setor";
	public static String TABELA_APRESENTACAO = "apresentacao";

	public static final int SIM = 1;
	public static final int NAO = 0;

	public static String CREATE_TABLE = "CREATE  TABLE " + TABELA_APRESENTACAO
			+ " (  " + COLUNA_ID_APRESENTACAO
			+ " INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL ,  " + COLUNA_DIA
			+ " INTEGER  ,  " + COLUNA_HORA_INICIO + " REAL  ,  "
			+ COLUNA_HORA_FIM + " REAL  ,  " + COLUNA_NOME + " TEXT  ,  "
			+ COLUNA_CATEGORIA + " TEXT  ,  " + COLUNA_SETOR + " TEXT  ,  "
			+ COLUNA_FAVORITO + " INTEGER );";

	public ApresentacaoDAO(Context ctx) {
		super(ctx);
	}

	public static long inserir(Apresentacao apr) {
		ContentValues values = deApresentacaoParaContentValues(apr);
		return inserir(TABELA_APRESENTACAO, values);
	}

	public static long inserir(ContentValues values) {
		return inserir(TABELA_APRESENTACAO, values);
	}

	public static long atualizar(Apresentacao apr) {
		ContentValues values = deApresentacaoParaContentValues(apr);
		return atualizar(TABELA_APRESENTACAO, values,
				new String[] { COLUNA_ID_APRESENTACAO },
				new String[] { String.valueOf(apr.getIdApresentacao()) });
	}

	public static Apresentacao get(long idApresentacao) {
		Cursor c = consultar(TABELA_APRESENTACAO, COLUNA_ID_APRESENTACAO,
				String.valueOf(idApresentacao));
		Apresentacao apr = deCursorParaApresentacao(c);
		c.close();
		return apr;
	}

	public static List<Apresentacao> consultarShowsPorSetorEDia(String setor,
			int dia) {
		Cursor c = consultarAND(TABELA_APRESENTACAO, null, new String[] {
				COLUNA_SETOR, COLUNA_DIA, COLUNA_CATEGORIA }, new String[] {
				setor, String.valueOf(dia), Constantes.SHOW });
		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	private static Apresentacao deCursorParaApresentacao(Cursor c) {
		Apresentacao apr = new Apresentacao();
		apr.setIdApresentacao((c.getLong(c
				.getColumnIndex(COLUNA_ID_APRESENTACAO))));
		apr.setFavorito(c.getLong(c.getColumnIndex(COLUNA_FAVORITO)) >= SIM);
		apr.setDia(c.getInt(c.getColumnIndex(COLUNA_DIA)));

		float hora = c.getFloat(c.getColumnIndex(COLUNA_HORA_INICIO));
		hora = hora > 24 ? hora - 24 : hora;
		apr.setHoraInicio(hora);

		hora = c.getFloat(c.getColumnIndex(COLUNA_HORA_FIM));
		hora = hora > 24 ? hora - 24 : hora;
		apr.setHoraFim(hora);

		apr.setNome(c.getString(c.getColumnIndex(COLUNA_NOME)));
		apr.setCategoria(c.getString(c.getColumnIndex(COLUNA_CATEGORIA)));
		apr.setSetor(c.getString(c.getColumnIndex(COLUNA_SETOR)));

		return apr;
	}

	private static ContentValues deApresentacaoParaContentValues(
			Apresentacao apr) {
		ContentValues values = new ContentValues();
		// values.put(COLUNA_ID_APRESENTACAO, apr.getIdApresentacao());
		values.put(COLUNA_FAVORITO, apr.isFavorito() ? SIM : NAO);
		values.put(COLUNA_DIA, apr.getDia());
		values.put(
				COLUNA_HORA_INICIO,
				apr.getHoraInicio() < 12 ? apr.getHoraInicio() + 24 : apr
						.getHoraInicio());
		values.put(
				COLUNA_HORA_FIM,
				apr.getHoraFim() < 12 ? apr.getHoraFim() + 24 : apr
						.getHoraFim());
		values.put(COLUNA_NOME, apr.getNome());
		values.put(COLUNA_CATEGORIA, apr.getCategoria());
		values.put(COLUNA_SETOR, apr.getSetor());

		return values;
	}

	public static Cursor consultarTodos() {
		return consultarTodos(TABELA_APRESENTACAO);
	}

	public static List<Apresentacao> consultarTodosShows() {
		Cursor c = consultar(TABELA_APRESENTACAO, COLUNA_CATEGORIA,
				Constantes.SHOW);

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static boolean remover(long idApresentacao) {
		return remover(TABELA_APRESENTACAO, COLUNA_ID_APRESENTACAO,
				idApresentacao);
	}

	public static boolean removerTodos() {
		return removerTodos(TABELA_APRESENTACAO);
	}

	public static List<Apresentacao> consultarTodosFavoritos() {
		Cursor c = consultar(TABELA_APRESENTACAO, COLUNA_FAVORITO,
				String.valueOf(SIM));

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static List<Apresentacao> consultarFavoritosDoDia(int dia) {
		Cursor c = consultar(TABELA_APRESENTACAO, null, new String[] {
				COLUNA_FAVORITO, COLUNA_DIA },
				new String[] { String.valueOf(SIM), String.valueOf(dia) },
				COLUNA_HORA_INICIO);

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static List<Apresentacao> consultarTodosDesfiles() {
		Cursor c = consultarAND(TABELA_APRESENTACAO, null,
				new String[] { COLUNA_CATEGORIA },
				new String[] { Constantes.DESFILE });

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static Apresentacao consultarDesfile(int dia) {
		Cursor c = consultarAND(TABELA_APRESENTACAO, null, new String[] {
				COLUNA_CATEGORIA, COLUNA_DIA }, new String[] {
				Constantes.DESFILE, String.valueOf(dia) });

		Apresentacao apr = new Apresentacao();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				apr = deCursorParaApresentacao(c);
				c.moveToNext();
			}
			c.close();
		}
		return apr;
	}

	public static boolean temDesfile(int dia) {
		Cursor c = consultarAND(TABELA_APRESENTACAO, null, new String[] {
				COLUNA_CATEGORIA, COLUNA_DIA }, new String[] {
				Constantes.DESFILE, String.valueOf(dia) });

		if (c != null) {
			c.moveToFirst();
			if (!c.isAfterLast()) {
				c.close();
				return true;
			}
			c.close();
		}
		return false;

	}

	public static List<Apresentacao> consultar(String nomeLike, String[] keys,
			String[] values) {
		Cursor c = consultarLikeAnd(TABELA_APRESENTACAO, null, COLUNA_NOME,
				nomeLike, keys, values);

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static List<Apresentacao> consultar(String[] keys, String[] values) {
		Cursor c = consultarAND(TABELA_APRESENTACAO, null, keys, values);

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}

	public static List<Apresentacao> consultar(String texto) {
		Cursor c = consultarLike(TABELA_APRESENTACAO, null, COLUNA_NOME, texto);

		List<Apresentacao> aprs = new ArrayList<Apresentacao>();

		if (c != null) {
			c.moveToFirst();
			while (!c.isAfterLast()) {
				aprs.add(deCursorParaApresentacao(c));
				c.moveToNext();
			}
			c.close();
		}
		return aprs;
	}
}
